package net.yxsoft.kit;

import com.jfinal.plugin.activerecord.Model;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.safety.Whitelist;

import java.util.List;

/**
 * 使用 Jsoup 对 html 进行过滤
 */
@SuppressWarnings("rawtypes")
public class JsoupFilter {

  /**
   * 用于过滤 content 字段的白名单，需要允许比较多的 tag
   */
  private static final Whitelist contentWhitelist = createContentWhitelist();
  private static final Document.OutputSettings notPrettyPrint = new Document.OutputSettings().prettyPrint(false);

  private static Whitelist createContentWhitelist() {
    return  Whitelist.relaxed()
        /**
         * 必须要删除应用在 a 与 img 上的 protocols，否则就只有使用了这些 protocol 的才不被过滤，比较蛋疼
         * 在 remove 的时候，后面的 protocols 要完全一个不露的对应上 jsoup 默认已经添加的，否则仍然会被过滤掉
         * 在升级 jsoup 后需要测试这 a 与 img 的过滤是否正常
         */
        .removeProtocols("a", "href", "ftp", "http", "https", "mailto")
        .removeProtocols("img", "src", "http", "https")

        .addAttributes("a", "href", "title", "target")  // 官方默认会将 target 给过滤掉

        /**
         * 放开 video
         */
        .addAttributes("video", "src", "controls", "width", "height", "poster", "preload", "muted", "loop", "autoplay")

        /**
         * 在 Whitelist.relaxed() 之外添加额外的白名单规则
         */
        .addTags("div", "span", "embed", "object", "param")
        .addAttributes(":all", "style", "class", "id", "name")
        .addAttributes("object", "width", "height", "classid", "codebase")
        .addAttributes("param", "name", "value")
        .addAttributes("embed", "src", "quality", "width", "height", "allowFullScreen", "allowScriptAccess", "flashvars", "name", "type", "pluginspage");
  }

  /**
   * 对要显示在列表中的 list 进行过滤，将其中的 content 转成纯文本
   */
  public static void filterModelList(List<? extends Model> modelList, int contentLen) {
    for (Model m : modelList) {

      String content = getText(null == m.get("attrib_19") ? " " : m.getStr("attrib_19")).replaceAll("&nbsp;", " ");
      if (content.length() > contentLen) {
        content = content.substring(0, contentLen - 1);
      }
      m.set("attrib_19", content);
    }
  }

  /**
   * 获取 html 中的纯文本信息，过滤所有 tag
   */
  public static String getText(String html) {
    return html != null ? Jsoup.clean(html, Whitelist.none()) : null;
  }
}
